package practiceProjects;

import java.io.*;

/**
 * @Project ：learn_java
 * @File ：moveAllPdfFilesInCDrive.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/2 09:45
 * @Description ：已知原文件夹里面的所有子文件夹里面都有且只有一个文档，
 * 此程序将里面的所有文件移动到目标文件夹，且删除原文件夹下面的所有子文件夹
 *
 * 经过实测，本程序移动功能没有问题，但在删除方面存在不足。
 * 程序中直接调用delete函数企图删除整个文件夹，但delete函数中可以删除空文件夹
 * 正确做法应该是递归删除。
 */

public class moveAllPdfFilesInCDrive {
    public static void main(String[] args) {
        String srcPath = "C:\\Users\\zhq11\\AppData\\Roaming\\pcsuite\\data\\Note\\Document";
        String destPath = "D:\\pdf文件test";

        try {
            // 创建终点文件夹
            File destF = new File(destPath);
            boolean mkdir = destF.mkdir();
            if (mkdir) {
                System.out.println("创建文件夹成功");
            } else {
                System.out.println("创建文件夹失败");
                return;
            }

            // 移动和删除
            moveAndDelete(srcPath, destPath);
        } catch (SecurityException e) {
            System.err.println("安全异常，可能没有足够的权限进行操作: " + e.getMessage());
        } catch (NullPointerException e) {
            System.err.println("空指针异常，可能是文件路径或文件对象为空: " + e.getMessage());
        }
    }

    /**
     * 移动文件和删除文件夹
     *
     * @param sourceFilePath
     * @param destinationFilePath
     */
    public static void moveAndDelete(String sourceFilePath, String destinationFilePath) {
        try {
            File f = new File(sourceFilePath);
            if (!f.exists()) {
                throw new FileNotFoundException("源文件夹不存在: " + sourceFilePath);
            }
            File[] files = f.listFiles();
            if (files == null) {
                throw new IOException("无法列出源文件夹中的文件: " + sourceFilePath);
            }
            for (File i : files) {
                if (i.isDirectory()) {
                    File[] files1 = i.listFiles();
                    if (files1 == null || files1.length == 0) {
                        throw new IOException("子文件夹中没有文件: " + i.getAbsolutePath());
                    }
                    File srcFile = files1[0];
                    File destFile = new File(destinationFilePath, srcFile.getName());

                    // 一定要移动成功过后再删除文件，否则文件将无法找回
                    if (!moveFile(srcFile, destFile)) {
                        System.out.println("出现错误，无法正常移动");
                        // 只要出错，直接终止程序
                        return;
                    } else {
                        System.out.println(srcFile + "移动成功");
                    }
                    // 删除子文件夹
                    if (!i.delete()) {
                        System.err.println("无法删除子文件夹: " + i.getAbsolutePath());
                    }
                }
            }
            System.out.println("全部文件移动完成");
            // 删除原文件夹
            if (!f.delete()) {
                System.err.println("无法删除原文件夹: " + sourceFilePath);
            } else {
                System.out.println("原文件夹已删除");
            }
            System.out.println("程序かんりょう");
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到异常: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("输入输出异常: " + e.getMessage());
        }
    }

    public static boolean moveFile(File s, File d) {
        try (FileInputStream fis = new FileInputStream(s);
             FileOutputStream fos = new FileOutputStream(d);
             BufferedInputStream bis = new BufferedInputStream(fis);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            byte[] buffer = new byte[8192]; // 8KB 缓冲区
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
            bos.flush(); // 确保数据写入
            return true;
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到异常，无法打开文件: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("输入输出异常，文件复制过程中出现问题: " + e.getMessage());
        }
        return false;
    }
}
